perm filename TANOLD.PAS[WEB,ALS] blob sn#628246 filedate 1981-12-07 generic text, type T, neo UTF8
{2}{4}{$C-,A+,D-}{[$C+,D+]}PROGRAM TANGLE(INPUT,OUTPUT,POOL,TTY);
LABEL 9999;CONST{7}BUFSIZE=100;MAXBYTES=30000;MAXTOKS=65535;
MAXNAMES=4000;MAXTEXTS=2000;HASHSIZE=353;LONGESTNAME=300;LINELENGTH=72;
OUTBUFSIZE=144;STACKSIZE=50;MAXIDLENGTH=12;UNAMBIGLENGT=7;
TYPE{8}ASCIICODE=0..127;{30}EIGHTBITS=0..255;SIXTEENBITS=0..65535;
{32}NAMEPOINTER=0..MAXNAMES;{35}TEXTPOINTER=0..MAXTEXTS;
{69}OUTPUTSTATE=RECORD ENDFIELD:SIXTEENBITS;BYTEFIELD:SIXTEENBITS;
NAMEFIELD:NAMEPOINTER;REPLFIELD:TEXTPOINTER;END;
VAR{10}XORD:ARRAY[CHAR]OF ASCIICODE;XCHR:ARRAY[ASCIICODE]OF CHAR;
{18}POOL:FILE OF CHAR;{20}BUFFER:ARRAY[0..BUFSIZE]OF ASCIICODE;
{22}PHASEONE:BOOLEAN;{31}BYTEMEM:PACKED ARRAY[0..MAXBYTES]OF ASCIICODE;
TOKMEM:PACKED ARRAY[0..MAXTOKS]OF EIGHTBITS;
BYTESTART:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
TOKSTART:ARRAY[0..MAXTEXTS]OF SIXTEENBITS;
LINK:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
ILK:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
EQUIV:ARRAY[0..MAXNAMES]OF SIXTEENBITS;
TEXTLINK:ARRAY[0..MAXTEXTS]OF SIXTEENBITS;{33}NAMEPTR:NAMEPOINTER;
STRINGPTR:NAMEPOINTER;BYTEPTR:0..MAXBYTES;{36}TEXTPTR:TEXTPOINTER;
TOKPTR:0..MAXTOKS;{MAXTOKPTR:0..MAXTOKS;}{41}IDFIRST:0..BUFSIZE;
IDLOC:0..BUFSIZE;DOUBLECHARS:0..BUFSIZE;
HASH,CHOPHASH:ARRAY[0..HASHSIZE]OF SIXTEENBITS;
CHOPPEDID:ARRAY[0..UNAMBIGLENGT]OF ASCIICODE;
{56}MODULE:ARRAY[0..LONGESTNAME]OF ASCIICODE;
{61}LASTUNNAMED:TEXTPOINTER;{70}CURSTATE:OUTPUTSTATE;
STACK:ARRAY[1..STACKSIZE]OF OUTPUTSTATE;STACKPTR:0..STACKSIZE;
{72}BRACELEVEL:EIGHTBITS;{76}CURVAL:INTEGER;
{84}OUTBUF:ARRAY[0..OUTBUFSIZE]OF ASCIICODE;OUTPTR:0..OUTBUFSIZE;
BREAKPTR:0..OUTBUFSIZE;SEMIPTR:0..OUTBUFSIZE;{85}OUTSTATE:EIGHTBITS;
OUTVAL,OUTAPP:INTEGER;OUTSIGN:ASCIICODE;
{90}OUTCONTRIB:ARRAY[1..LINELENGTH]OF ASCIICODE;{112}PAGE:SIXTEENBITS;
LINE:SIXTEENBITS;LIMIT:0..BUFSIZE;LOC:0..BUFSIZE;INPUTHASENDE:BOOLEAN;
{120}CURMODULE:NAMEPOINTER;{131}NEXTCONTROL:EIGHTBITS;
{138}CURREPLTEXT:TEXTPOINTER;{144}MODULECOUNT:0..12287;
{152}{TROUBLESHOOT:BOOLEAN;DDT:SIXTEENBITS;DD:SIXTEENBITS;
DEBUGCYCLE:INTEGER;DEBUGSKIPPED:INTEGER;}{23}{PROCEDURE DEBUGHELP;
FORWARD;}{24}PROCEDURE ERROR;VAR J:0..OUTBUFSIZE;K,L:0..BUFSIZE;
BEGIN IF PHASEONE THEN{25}BEGIN WRITELN(TTY,'. (p.',PAGE:0,',l.',LINE:0,
')');IF LOC>=LIMIT THEN L:=LIMIT ELSE L:=LOC;
FOR K:=1 TO L DO IF BUFFER[K-1]=9 THEN WRITE(TTY,' ')ELSE WRITE(TTY,XCHR
[BUFFER[K-1]]);WRITELN(TTY);FOR K:=1 TO L DO WRITE(TTY,' ');
FOR K:=L+1 TO LIMIT DO WRITE(TTY,XCHR[BUFFER[K-1]]);WRITE(TTY,' ');
END ELSE{26}BEGIN WRITELN(TTY,'. (l.',LINE:0,')');
FOR J:=1 TO OUTPTR DO WRITE(TTY,XCHR[OUTBUF[J-1]]);WRITE(TTY,'...');END;
{DEBUGHELP;}END;{27}PROCEDURE QUIT;BEGIN GOTO 9999;END;
PROCEDURE INITIALIZE;VAR{9}I:0..127;{42}H:0..HASHSIZE;
BEGIN{11}XCHR[32]:=' ';XCHR[33]:='!';XCHR[34]:='"';XCHR[35]:='#';
XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&';XCHR[39]:='''';XCHR[40]:='(';
XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+';XCHR[44]:=',';XCHR[45]:='-';
XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0';XCHR[49]:='1';XCHR[50]:='2';
XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5';XCHR[54]:='6';XCHR[55]:='7';
XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':';XCHR[59]:=';';XCHR[60]:='<';
XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?';XCHR[64]:='@';XCHR[65]:='A';
XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D';XCHR[69]:='E';XCHR[70]:='F';
XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I';XCHR[74]:='J';XCHR[75]:='K';
XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N';XCHR[79]:='O';XCHR[80]:='P';
XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S';XCHR[84]:='T';XCHR[85]:='U';
XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X';XCHR[89]:='Y';XCHR[90]:='Z';
XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']';XCHR[94]:='↑';XCHR[95]:='←';
XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b';XCHR[99]:='c';XCHR[100]:='d';
XCHR[101]:='e';XCHR[102]:='f';XCHR[103]:='g';XCHR[104]:='h';
XCHR[105]:='i';XCHR[106]:='j';XCHR[107]:='k';XCHR[108]:='l';
XCHR[109]:='m';XCHR[110]:='n';XCHR[111]:='o';XCHR[112]:='p';
XCHR[113]:='q';XCHR[114]:='r';XCHR[115]:='s';XCHR[116]:='t';
XCHR[117]:='u';XCHR[118]:='v';XCHR[119]:='w';XCHR[120]:='x';
XCHR[121]:='y';XCHR[122]:='z';XCHR[123]:='{';XCHR[124]:='|';
XCHR[125]:='}';XCHR[126]:='~';XCHR[0]:=' ';XCHR[127]:=' ';
{13}FOR I:=1 TO 31 DO XCHR[I]:=CHR(I);XCHR[24]:=CHR(95);
XCHR[26]:=CHR(27);XCHR[27]:=CHR(126);
{14}FOR I:=0 TO 127 DO XORD[CHR(I)]:=32;
FOR I:=1 TO 126 DO XORD[XCHR[I]]:=I;{19}REWRITE(POOL);{34}NAMEPTR:=1;
STRINGPTR:=128;BYTEPTR:=1;BYTESTART[0]:=1;BYTESTART[1]:=1;{37}TOKPTR:=1;
TEXTPTR:=1;TOKSTART[0]:=1;TOKSTART[1]:=1;{39}ILK[0]:=0;EQUIV[0]:=0;
{43}FOR H:=0 TO HASHSIZE-1 DO BEGIN HASH[H]:=0;CHOPHASH[H]:=0;END;
{62}LASTUNNAMED:=0;TEXTLINK[0]:=0;{127}MODULE[0]:=32;
{153}{TROUBLESHOOT:=TRUE;DEBUGCYCLE:=1;DEBUGSKIPPED:=0;
TROUBLESHOOT:=FALSE;DEBUGCYCLE:=99999;}END;{17}PROCEDURE OPENINPUT;
BEGIN RESET(INPUT,'','/E');END;{21}FUNCTION INPUTLN:BOOLEAN;LABEL 30;
BEGIN IF EOF(INPUT)THEN INPUTLN:=FALSE ELSE BEGIN LIMIT:=0;
BUFFER[0]:=XORD[INPUT↑];
IF BUFFER[0]=12 THEN READLN ELSE WHILE TRUE DO BEGIN IF EOLN(INPUT)AND(
INPUT↑<>CHR(26))AND(INPUT↑<>CHR(27))THEN BEGIN BUFFER[LIMIT]:=13;READLN;
GOTO 30;END;IF LIMIT=BUFSIZE-1 THEN BEGIN BUFFER[LIMIT]:=13;
BEGIN WRITELN(TTY);WRITE(TTY,'! Input line too long');END;ERROR;GOTO 30;
END;LIMIT:=LIMIT+1;GET(INPUT);IF EOF(INPUT)THEN BEGIN BUFFER[LIMIT]:=13;
GOTO 30;END;BUFFER[LIMIT]:=XORD[INPUT↑];END;30:INPUTLN:=TRUE;END;END;
{40}PROCEDURE PRINTID(P:NAMEPOINTER);VAR K:0..MAXBYTES;
BEGIN IF P>=NAMEPTR THEN WRITE(TTY,'IMPOSSIBLE')ELSE FOR K:=BYTESTART[P]
TO BYTESTART[P+1]-1 DO WRITE(TTY,XCHR[BYTEMEM[K]]);END;
{44}FUNCTION IDLOOKUP(T:EIGHTBITS):NAMEPOINTER;LABEL 31,32;
VAR C:EIGHTBITS;I:0..BUFSIZE;H:0..HASHSIZE;K:0..MAXBYTES;L:0..BUFSIZE;
P,Q:NAMEPOINTER;S:0..UNAMBIGLENGT;BEGIN L:=IDLOC-IDFIRST;
{45}H:=BUFFER[IDFIRST];I:=IDFIRST+1;
WHILE I<IDLOC DO BEGIN H:=(H+H+BUFFER[I])MOD HASHSIZE;I:=I+1;END;
{46}P:=HASH[H];
WHILE P<>0 DO BEGIN IF BYTESTART[P+1]-BYTESTART[P]=L THEN{47}BEGIN I:=
IDFIRST;K:=BYTESTART[P];
WHILE(I<IDLOC)AND(BUFFER[I]=BYTEMEM[K])DO BEGIN I:=I+1;K:=K+1;END;
IF I=IDLOC THEN GOTO 31;END;P:=LINK[P];END;P:=NAMEPTR;LINK[P]:=HASH[H];
HASH[H]:=P;31:;
IF(P=NAMEPTR)OR(T<>0)THEN{48}BEGIN IF((P<>NAMEPTR)AND(T<>0)AND(ILK[P]=0)
)OR((P=NAMEPTR)AND(T=0)AND(BUFFER[IDFIRST]<>34))THEN{49}BEGIN I:=IDFIRST
;S:=0;H:=0;
WHILE(I<IDLOC)AND(S<UNAMBIGLENGT)DO BEGIN IF BUFFER[I]<>95 THEN BEGIN IF
BUFFER[I]>=97 THEN CHOPPEDID[S]:=BUFFER[I]-32 ELSE CHOPPEDID[S]:=BUFFER[
I];H:=(H+H+CHOPPEDID[S])MOD HASHSIZE;S:=S+1;END;I:=I+1;END;
CHOPPEDID[S]:=0;END;
IF P<>NAMEPTR THEN{50}BEGIN IF ILK[P]=0 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! This identifier has already appeared');ERROR;END;
{51}Q:=CHOPHASH[H];
IF Q=P THEN CHOPHASH[H]:=EQUIV[P]ELSE BEGIN WHILE EQUIV[Q]<>P DO Q:=
EQUIV[Q];EQUIV[Q]:=EQUIV[P];END;END ELSE BEGIN WRITELN(TTY);
WRITE(TTY,'! This identifier was defined before');ERROR;END;ILK[P]:=T;
END ELSE{52}BEGIN IF(T=0)AND(BUFFER[IDFIRST]<>34)THEN{53}BEGIN Q:=
CHOPHASH[H];WHILE Q<>0 DO BEGIN{54}BEGIN K:=BYTESTART[Q];S:=0;
WHILE(K<BYTESTART[Q+1])AND(S<UNAMBIGLENGT)DO BEGIN C:=BYTEMEM[K];
IF C<>95 THEN BEGIN IF C>=97 THEN C:=C-32;
IF CHOPPEDID[S]<>C THEN GOTO 32;S:=S+1;END;K:=K+1;END;
IF(K=BYTESTART[Q+1])AND(CHOPPEDID[S]<>0)THEN GOTO 32;BEGIN WRITELN(TTY);
WRITE(TTY,'! Identifier conflict with ');END;
FOR K:=BYTESTART[Q]TO BYTESTART[Q+1]-1 DO WRITE(TTY,XCHR[BYTEMEM[K]]);
ERROR;Q:=0;32:END;Q:=EQUIV[Q];END;EQUIV[P]:=CHOPHASH[H];CHOPHASH[H]:=P;
END;IF BYTEPTR+L>MAXBYTES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','byte memory',' capacity exceeded');ERROR;QUIT;
END;IF NAMEPTR=MAXNAMES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','name',' capacity exceeded');ERROR;QUIT;END;
I:=IDFIRST;K:=BYTEPTR;WHILE I<IDLOC DO BEGIN BYTEMEM[K]:=BUFFER[I];
K:=K+1;I:=I+1;END;BYTEPTR:=K;NAMEPTR:=NAMEPTR+1;BYTESTART[NAMEPTR]:=K;
IF BUFFER[IDFIRST]<>34 THEN ILK[P]:=T ELSE{55}BEGIN ILK[P]:=1;
IF L-DOUBLECHARS=2 THEN EQUIV[P]:=BUFFER[IDFIRST+1]+32768 ELSE BEGIN
EQUIV[P]:=STRINGPTR+32768;L:=L-DOUBLECHARS-1;
IF L>99 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Preprocessed string is too long');ERROR;END;
STRINGPTR:=STRINGPTR+1;WRITE(POOL,XCHR[48+L DIV 10],XCHR[48+L MOD 10]);
I:=IDFIRST+1;WHILE I<IDLOC DO BEGIN WRITE(POOL,XCHR[BUFFER[I]]);
IF(BUFFER[I]=34)OR(BUFFER[I]=64)THEN I:=I+2 ELSE I:=I+1;END;END;END;END;
END;IDLOOKUP:=P;END;{57}FUNCTION MODLOOKUP(L:SIXTEENBITS):NAMEPOINTER;
LABEL 31;VAR C:(LESS,EQUAL,GREATER,PREFIX,EXTENSION);J:0..LONGESTNAME;
K:0..MAXBYTES;P:NAMEPOINTER;Q:NAMEPOINTER;BEGIN C:=GREATER;Q:=0;
P:=ILK[0];WHILE P<>0 DO BEGIN{59}BEGIN K:=BYTESTART[P];C:=EQUAL;J:=1;
WHILE(K<BYTESTART[P+1])AND(J<=L)AND(MODULE[J]=BYTEMEM[K])DO BEGIN K:=K+1
;J:=J+1;END;
IF K=BYTESTART[P+1]THEN IF J>L THEN C:=EQUAL ELSE C:=EXTENSION ELSE IF J
>L THEN C:=PREFIX ELSE IF MODULE[J]<BYTEMEM[K]THEN C:=LESS ELSE C:=
GREATER;END;Q:=P;
IF C=LESS THEN P:=LINK[Q]ELSE IF C=GREATER THEN P:=ILK[Q]ELSE GOTO 31;
END;{58}IF BYTEPTR+L>MAXBYTES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','byte memory',' capacity exceeded');ERROR;QUIT;
END;IF NAMEPTR=MAXNAMES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','name',' capacity exceeded');ERROR;QUIT;END;
P:=NAMEPTR;IF C=LESS THEN LINK[Q]:=P ELSE ILK[Q]:=P;LINK[P]:=0;
ILK[P]:=0;C:=EQUAL;EQUIV[P]:=0;
FOR J:=1 TO L DO BYTEMEM[BYTEPTR+J-1]:=MODULE[J];BYTEPTR:=BYTEPTR+L;
NAMEPTR:=NAMEPTR+1;BYTESTART[NAMEPTR]:=BYTEPTR;;
31:IF C<>EQUAL THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Incompatible module names');ERROR;END;P:=0;END;
MODLOOKUP:=P;END;{60}FUNCTION PREFIXLOOKUP(L:SIXTEENBITS):NAMEPOINTER;
LABEL 31;VAR C:(LESS,EQUAL,GREATER,PREFIX,EXTENSION);COUNT:0..MAXNAMES;
J:0..LONGESTNAME;K:0..MAXBYTES;P:NAMEPOINTER;Q:NAMEPOINTER;
R:NAMEPOINTER;BEGIN Q:=0;P:=ILK[0];COUNT:=0;R:=0;
WHILE P<>0 DO BEGIN{59}BEGIN K:=BYTESTART[P];C:=EQUAL;J:=1;
WHILE(K<BYTESTART[P+1])AND(J<=L)AND(MODULE[J]=BYTEMEM[K])DO BEGIN K:=K+1
;J:=J+1;END;
IF K=BYTESTART[P+1]THEN IF J>L THEN C:=EQUAL ELSE C:=EXTENSION ELSE IF J
>L THEN C:=PREFIX ELSE IF MODULE[J]<BYTEMEM[K]THEN C:=LESS ELSE C:=
GREATER;END;
IF C=LESS THEN P:=LINK[P]ELSE IF C=GREATER THEN P:=ILK[P]ELSE BEGIN R:=P
;COUNT:=COUNT+1;Q:=ILK[P];P:=LINK[P];END;IF P=0 THEN BEGIN P:=Q;Q:=0;
END;END;IF COUNT<>1 THEN IF COUNT=0 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Name does not match');ERROR;END ELSE BEGIN WRITELN(TTY);
WRITE(TTY,'! Ambiguous prefix');ERROR;END;PREFIXLOOKUP:=R;END;
{64}PROCEDURE STORETWOBYTE(X:SIXTEENBITS);
BEGIN IF TOKPTR+2>MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=X DIV 256;TOKMEM[TOKPTR+1]:=X MOD 256;TOKPTR:=TOKPTR+2;
END;{65}{PROCEDURE PRINTREPL(P:TEXTPOINTER);VAR K:0..MAXTOKS;
A:SIXTEENBITS;
BEGIN IF P>=TEXTPTR THEN WRITE(TTY,'BAD')ELSE BEGIN K:=TOKSTART[P];
WHILE K<TOKSTART[P+1]DO BEGIN A:=TOKMEM[K];
IF A>=128 THEN[66]BEGIN K:=K+1;
IF A<168 THEN BEGIN A:=(A-128)*256+TOKMEM[K];PRINTID(A);
IF BYTEMEM[BYTESTART[A]]=34 THEN WRITE(TTY,'"')ELSE WRITE(TTY,' ');
END ELSE IF A<208 THEN BEGIN WRITE(TTY,'@<');
PRINTID((A-168)*256+TOKMEM[K]);WRITE(TTY,'@>');
END ELSE BEGIN A:=(A-208)*256+TOKMEM[K];
WRITE(TTY,'@{',A:0,'@',XCHR[125]);END;
END ELSE[67]CASE A OF 9:WRITE(TTY,'@{');10:WRITE(TTY,'@',XCHR[125]);
12:WRITE(TTY,'@''');13:WRITE(TTY,'#');64:WRITE(TTY,'@@');
OTHERS:WRITE(TTY,XCHR[A])END;K:=K+1;END;END;END;
}{74}PROCEDURE PUSHLEVEL(P:NAMEPOINTER);
BEGIN IF STACKPTR=STACKSIZE THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','stack',' capacity exceeded');ERROR;QUIT;
END ELSE BEGIN STACK[STACKPTR]:=CURSTATE;STACKPTR:=STACKPTR+1;
CURSTATE.NAMEFIELD:=P;CURSTATE.REPLFIELD:=EQUIV[P];
CURSTATE.BYTEFIELD:=TOKSTART[CURSTATE.REPLFIELD];
CURSTATE.ENDFIELD:=TOKSTART[CURSTATE.REPLFIELD+1];END;END;
{75}PROCEDURE POPLEVEL;LABEL 10;
BEGIN IF TEXTLINK[CURSTATE.REPLFIELD]=0 THEN BEGIN IF ILK[CURSTATE.
NAMEFIELD]=3 THEN{81}BEGIN{IF TOKPTR>MAXTOKPTR THEN MAXTOKPTR:=TOKPTR;
}NAMEPTR:=NAMEPTR-1;TEXTPTR:=TEXTPTR-1;TOKPTR:=TOKSTART[TEXTPTR];
{BYTEPTR:=BYTEPTR-1;}END;
END ELSE IF TEXTLINK[CURSTATE.REPLFIELD]<MAXTEXTS THEN BEGIN CURSTATE.
REPLFIELD:=TEXTLINK[CURSTATE.REPLFIELD];
CURSTATE.BYTEFIELD:=TOKSTART[CURSTATE.REPLFIELD];
CURSTATE.ENDFIELD:=TOKSTART[CURSTATE.REPLFIELD+1];GOTO 10;END;
STACKPTR:=STACKPTR-1;IF STACKPTR>0 THEN CURSTATE:=STACK[STACKPTR];
10:END;{77}FUNCTION GETOUTPUT:SIXTEENBITS;LABEL 20,30;VAR A:SIXTEENBITS;
B:EIGHTBITS;BAL:SIXTEENBITS;
BEGIN 20:IF STACKPTR=0 THEN A:=0 ELSE BEGIN IF CURSTATE.BYTEFIELD=
CURSTATE.ENDFIELD THEN BEGIN POPLEVEL;GOTO 20;END;
A:=TOKMEM[CURSTATE.BYTEFIELD];CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
IF A<128 THEN BEGIN IF A=13 THEN{82}BEGIN PUSHLEVEL(NAMEPTR-1);GOTO 20;
END;END ELSE BEGIN A:=(A-128)*256+TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
IF A<10240 THEN{79}BEGIN CASE ILK[A]OF 0:BEGIN CURVAL:=A;A:=130;END;
1:BEGIN CURVAL:=EQUIV[A]-32768;A:=128;END;2:BEGIN PUSHLEVEL(A);GOTO 20;
END;
3:BEGIN{80}WHILE(CURSTATE.BYTEFIELD=CURSTATE.ENDFIELD)AND(STACKPTR>0)DO
POPLEVEL;
IF(STACKPTR=0)OR(TOKMEM[CURSTATE.BYTEFIELD]<>40)THEN BEGIN BEGIN WRITELN
(TTY);WRITE(TTY,'! No parameter given for ');END;PRINTID(A);ERROR;
GOTO 20;END;{83}BAL:=1;CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
WHILE TRUE DO BEGIN B:=TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
IF B=13 THEN STORETWOBYTE(NAMEPTR+32767)ELSE BEGIN IF B>=128 THEN BEGIN
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;B:=TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;
END ELSE CASE B OF 40:BAL:=BAL+1;41:BEGIN BAL:=BAL-1;
IF BAL=0 THEN GOTO 30;END;
39:REPEAT BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;B:=TOKMEM[CURSTATE.BYTEFIELD];
CURSTATE.BYTEFIELD:=CURSTATE.BYTEFIELD+1;UNTIL B=39;OTHERS:END;
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;END;END;30:;
EQUIV[NAMEPTR]:=TEXTPTR;ILK[NAMEPTR]:=2;
{IF BYTEPTR=MAXBYTES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','byte memory',' capacity exceeded');ERROR;QUIT;
END;BYTEMEM[BYTEPTR]:=35;BYTEPTR:=BYTEPTR+1;
}IF NAMEPTR=MAXNAMES THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','name',' capacity exceeded');ERROR;QUIT;END;
NAMEPTR:=NAMEPTR+1;BYTESTART[NAMEPTR]:=BYTEPTR;
IF TEXTPTR=MAXTEXTS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','text',' capacity exceeded');ERROR;QUIT;END;
TEXTLINK[TEXTPTR]:=0;TEXTPTR:=TEXTPTR+1;TOKSTART[TEXTPTR]:=TOKPTR;;
PUSHLEVEL(A);GOTO 20;END;OTHERS:BEGIN WRITELN(TTY);
WRITE(TTY,'! This can''t happen (','output',')');ERROR;QUIT;
END END END ELSE IF A<20480 THEN{78}BEGIN A:=A-10240;
IF EQUIV[A]<>0 THEN PUSHLEVEL(A)ELSE IF A<>0 THEN BEGIN BEGIN WRITELN(
TTY);WRITE(TTY,'! Not present: <');END;PRINTID(A);WRITE(TTY,'>');ERROR;
END;GOTO 20;END ELSE BEGIN CURVAL:=A-20480;A:=129;END;END;END;
{IF TROUBLESHOOT THEN DEBUGHELP;}GETOUTPUT:=A;END;
{87}PROCEDURE FLUSHBUFFER;VAR K:0..OUTBUFSIZE;B:0..OUTBUFSIZE;
BEGIN B:=BREAKPTR;
IF(SEMIPTR<>0)AND(OUTPTR-SEMIPTR<=LINELENGTH)THEN BREAKPTR:=SEMIPTR;
FOR K:=1 TO BREAKPTR DO WRITE(XCHR[OUTBUF[K-1]]);WRITELN;LINE:=LINE+1;
IF LINE MOD 100=0 THEN WRITE(TTY,'.');
IF BREAKPTR<OUTPTR THEN BEGIN IF OUTBUF[BREAKPTR]=32 THEN BEGIN BREAKPTR
:=BREAKPTR+1;IF BREAKPTR>B THEN B:=BREAKPTR;END;
FOR K:=BREAKPTR TO OUTPTR-1 DO OUTBUF[K-BREAKPTR]:=OUTBUF[K];END;
OUTPTR:=OUTPTR-BREAKPTR;BREAKPTR:=B-BREAKPTR;SEMIPTR:=0;
IF OUTPTR>LINELENGTH THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Long line must be truncated');ERROR;END;OUTPTR:=LINELENGTH;
END;END;{89}PROCEDURE APPVAL(V:INTEGER);VAR K:0..OUTBUFSIZE;
BEGIN K:=OUTBUFSIZE;REPEAT OUTBUF[K]:=V MOD 10;V:=V DIV 10;K:=K-1;
UNTIL V=0;REPEAT K:=K+1;BEGIN OUTBUF[OUTPTR]:=OUTBUF[K]+48;
OUTPTR:=OUTPTR+1;END;UNTIL K=OUTBUFSIZE;END;
{91}PROCEDURE SENDOUT(T:EIGHTBITS;V:SIXTEENBITS);LABEL 20;
VAR K:0..LINELENGTH;
BEGIN{92}20:CASE OUTSTATE OF 1:IF T<>3 THEN BEGIN BREAKPTR:=OUTPTR;
IF T=2 THEN BEGIN OUTBUF[OUTPTR]:=32;OUTPTR:=OUTPTR+1;END;END;
2:BEGIN BEGIN OUTBUF[OUTPTR]:=44-OUTAPP;OUTPTR:=OUTPTR+1;END;
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;BREAKPTR:=OUTPTR;END;
3,4:BEGIN{93}IF OUTVAL<0 THEN BEGIN OUTBUF[OUTPTR]:=45;OUTPTR:=OUTPTR+1;
END ELSE IF OUTSIGN>0 THEN BEGIN OUTBUF[OUTPTR]:=OUTSIGN;
OUTPTR:=OUTPTR+1;END;APPVAL(ABS(OUTVAL));
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;;OUTSTATE:=OUTSTATE-2;GOTO 20;END;
5:{94}BEGIN IF(T=3)OR({95}((T=2)AND(V=3)AND(((OUTCONTRIB[1]=68)AND(
OUTCONTRIB[2]=73)AND(OUTCONTRIB[3]=86))OR((OUTCONTRIB[1]=77)AND(
OUTCONTRIB[2]=79)AND(OUTCONTRIB[3]=68))))OR((T=0)AND((V=42)OR(V=47))))
THEN BEGIN{93}IF OUTVAL<0 THEN BEGIN OUTBUF[OUTPTR]:=45;
OUTPTR:=OUTPTR+1;
END ELSE IF OUTSIGN>0 THEN BEGIN OUTBUF[OUTPTR]:=OUTSIGN;
OUTPTR:=OUTPTR+1;END;APPVAL(ABS(OUTVAL));
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;;OUTSIGN:=43;OUTVAL:=OUTAPP;
END ELSE OUTVAL:=OUTVAL+OUTAPP;OUTSTATE:=3;GOTO 20;END;
0:IF T<>3 THEN BREAKPTR:=OUTPTR;OTHERS:END;
IF T<>0 THEN FOR K:=1 TO V DO BEGIN OUTBUF[OUTPTR]:=OUTCONTRIB[K];
OUTPTR:=OUTPTR+1;END ELSE BEGIN OUTBUF[OUTPTR]:=V;OUTPTR:=OUTPTR+1;END;
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;
IF(T=0)AND(V=59)THEN BEGIN SEMIPTR:=OUTPTR;BREAKPTR:=OUTPTR;END;
IF T>=2 THEN OUTSTATE:=1 ELSE OUTSTATE:=0 END;
{96}PROCEDURE SENDSIGN(V:INTEGER);
BEGIN CASE OUTSTATE OF 2,4:OUTAPP:=OUTAPP*V;3:BEGIN OUTAPP:=V;
OUTSTATE:=4;END;5:BEGIN OUTVAL:=OUTVAL+OUTAPP;OUTAPP:=V;OUTSTATE:=4;END;
OTHERS:BEGIN BREAKPTR:=OUTPTR;OUTAPP:=V;OUTSTATE:=2;END END;END;
{97}PROCEDURE SENDVAL(V:INTEGER);LABEL 666,10;
BEGIN CASE OUTSTATE OF 1:BEGIN{100}IF(OUTPTR=BREAKPTR+3)OR((OUTPTR=
BREAKPTR+4)AND(OUTBUF[BREAKPTR]=32))THEN IF((OUTBUF[OUTPTR-3]=68)AND(
OUTBUF[OUTPTR-2]=73)AND(OUTBUF[OUTPTR-1]=86))OR((OUTBUF[OUTPTR-3]=77)AND
(OUTBUF[OUTPTR-2]=79)AND(OUTBUF[OUTPTR-1]=68))THEN GOTO 666;OUTSIGN:=32;
OUTSTATE:=3;OUTVAL:=V;BREAKPTR:=OUTPTR;END;
0:BEGIN{99}IF(OUTPTR=BREAKPTR+1)AND((OUTBUF[BREAKPTR]=42)OR(OUTBUF[
BREAKPTR]=47))THEN GOTO 666;OUTSIGN:=0;OUTSTATE:=3;OUTVAL:=V;
BREAKPTR:=OUTPTR;END;{98}2:BEGIN OUTSIGN:=43;OUTSTATE:=3;
OUTVAL:=OUTAPP*V;END;3:BEGIN OUTSTATE:=5;OUTAPP:=V;END;
4:BEGIN OUTSTATE:=5;OUTAPP:=OUTAPP*V;END;5:BEGIN OUTVAL:=OUTVAL+OUTAPP;
OUTAPP:=V;END;OTHERS:GOTO 666 END;GOTO 10;
666:{101}IF V>=0 THEN BEGIN IF OUTSTATE=1 THEN BEGIN BREAKPTR:=OUTPTR;
BEGIN OUTBUF[OUTPTR]:=32;OUTPTR:=OUTPTR+1;END;END;APPVAL(V);
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;OUTSTATE:=1;
END ELSE BEGIN BEGIN OUTBUF[OUTPTR]:=40;OUTPTR:=OUTPTR+1;END;
BEGIN OUTBUF[OUTPTR]:=45;OUTPTR:=OUTPTR+1;END;APPVAL(-V);
BEGIN OUTBUF[OUTPTR]:=41;OUTPTR:=OUTPTR+1;END;
IF OUTPTR>LINELENGTH THEN FLUSHBUFFER;OUTSTATE:=0;END;10:END;
{103}PROCEDURE SENDTHEOUTPU;LABEL 2,21,22;VAR CURCHAR:EIGHTBITS;
K:0..LINELENGTH;J:0..MAXBYTES;N:INTEGER;
BEGIN WHILE STACKPTR>0 DO BEGIN CURCHAR:=GETOUTPUT;
21:CASE CURCHAR OF 0:;
{106}65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,
87,88,89,90:BEGIN OUTCONTRIB[1]:=CURCHAR;SENDOUT(2,1);END;
97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115
,116,117,118,119,120,121,122:BEGIN OUTCONTRIB[1]:=CURCHAR-32;
SENDOUT(2,1);END;130:BEGIN K:=0;J:=BYTESTART[CURVAL];
WHILE(K<MAXIDLENGTH)AND(J<BYTESTART[CURVAL+1])DO BEGIN K:=K+1;
OUTCONTRIB[K]:=BYTEMEM[J];J:=J+1;
IF OUTCONTRIB[K]>=97 THEN OUTCONTRIB[K]:=OUTCONTRIB[K]-32 ELSE IF
OUTCONTRIB[K]=95 THEN K:=K-1;END;SENDOUT(2,K);END;
{108}48,49,50,51,52,53,54,55,56,57:BEGIN N:=0;
REPEAT IF N>=214748364 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Constant too big');ERROR;END ELSE N:=10*N+CURCHAR-48;
CURCHAR:=GETOUTPUT;UNTIL(CURCHAR>57)OR(CURCHAR<48);SENDVAL(N);K:=0;
IF CURCHAR=101 THEN CURCHAR:=69;IF CURCHAR=69 THEN GOTO 2 ELSE GOTO 21;
END;12:BEGIN N:=0;CURCHAR:=48;
REPEAT IF N>=268435456 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Constant too big');ERROR;END ELSE N:=8*N+CURCHAR-48;
CURCHAR:=GETOUTPUT;UNTIL(CURCHAR>55)OR(CURCHAR<48);SENDVAL(N);GOTO 21;
END;128:SENDVAL(CURVAL);46:BEGIN K:=1;OUTCONTRIB[1]:=46;
CURCHAR:=GETOUTPUT;IF CURCHAR=46 THEN BEGIN OUTCONTRIB[2]:=46;
SENDOUT(1,2);
END ELSE IF(CURCHAR>=48)AND(CURCHAR<=57)THEN GOTO 2 ELSE BEGIN SENDOUT(0
,46);GOTO 21;END;END;43,45:SENDSIGN(44-CURCHAR);
{104}4:BEGIN OUTCONTRIB[1]:=65;OUTCONTRIB[2]:=78;OUTCONTRIB[3]:=68;
SENDOUT(2,3);END;5:BEGIN OUTCONTRIB[1]:=78;OUTCONTRIB[2]:=79;
OUTCONTRIB[3]:=84;SENDOUT(2,3);END;6:BEGIN OUTCONTRIB[1]:=73;
OUTCONTRIB[2]:=78;SENDOUT(2,2);END;31:BEGIN OUTCONTRIB[1]:=79;
OUTCONTRIB[2]:=82;SENDOUT(2,2);END;24:BEGIN OUTCONTRIB[1]:=58;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;26:BEGIN OUTCONTRIB[1]:=60;
OUTCONTRIB[2]:=62;SENDOUT(1,2);END;28:BEGIN OUTCONTRIB[1]:=60;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;29:BEGIN OUTCONTRIB[1]:=62;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;30:BEGIN OUTCONTRIB[1]:=61;
OUTCONTRIB[2]:=61;SENDOUT(1,2);END;32:BEGIN OUTCONTRIB[1]:=46;
OUTCONTRIB[2]:=46;SENDOUT(1,2);END;39:{107}BEGIN K:=1;OUTCONTRIB[1]:=39;
REPEAT IF K<LINELENGTH THEN K:=K+1;OUTCONTRIB[K]:=GETOUTPUT;
UNTIL(OUTCONTRIB[K]=39)OR(STACKPTR=0);
IF K=LINELENGTH THEN BEGIN WRITELN(TTY);WRITE(TTY,'! String too long');
ERROR;END;SENDOUT(1,K);CURCHAR:=GETOUTPUT;
IF CURCHAR=39 THEN OUTSTATE:=6;GOTO 21;END;
{105}33,34,35,36,37,38,40,41,42,44,47,58,59,60,61,62,63,64,91,92,93,94,
95,96,123,124,125:SENDOUT(0,CURCHAR);
{110}9:BEGIN IF BRACELEVEL=0 THEN SENDOUT(0,123)ELSE SENDOUT(0,91);
BRACELEVEL:=BRACELEVEL+1;END;
10:IF BRACELEVEL>0 THEN BEGIN BRACELEVEL:=BRACELEVEL-1;
IF BRACELEVEL=0 THEN SENDOUT(0,125)ELSE SENDOUT(0,93);
END ELSE BEGIN WRITELN(TTY);WRITE(TTY,'! Extra @}');ERROR;END;
129:IF BRACELEVEL=0 THEN BEGIN SENDOUT(0,123);SENDVAL(CURVAL);
SENDOUT(0,125);END ELSE BEGIN SENDOUT(0,91);SENDVAL(CURVAL);
SENDOUT(0,93);END;127:BEGIN SENDOUT(3,0);OUTSTATE:=6;END;
OTHERS:BEGIN WRITELN(TTY);
WRITE(TTY,'! Can''t output ascii code ',CURCHAR:0);ERROR;END END;
GOTO 22;2:{109}REPEAT IF K<LINELENGTH THEN K:=K+1;
OUTCONTRIB[K]:=CURCHAR;CURCHAR:=GETOUTPUT;
IF(OUTCONTRIB[K]=69)AND((CURCHAR=43)OR(CURCHAR=45))THEN BEGIN IF K<
LINELENGTH THEN K:=K+1;OUTCONTRIB[K]:=CURCHAR;CURCHAR:=GETOUTPUT;
END ELSE IF CURCHAR=101 THEN CURCHAR:=69;
UNTIL(CURCHAR<>69)AND((CURCHAR<48)OR(CURCHAR>57));
IF K=LINELENGTH THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Fraction too long');ERROR;END;SENDOUT(3,K);GOTO 21;22:END;
END;{114}PROCEDURE GETLINE;BEGIN IF BUFFER[0]=12 THEN LINE:=0;
IF INPUTLN THEN BEGIN IF LINE=0 THEN BEGIN PAGE:=PAGE+1;
{115}{IF(PAGE=1)AND(LIMIT=29)THEN IF(BUFFER[0]=67)AND(BUFFER[8]=22)THEN
REPEAT IF INPUTLN THEN ELSE BEGIN LIMIT:=0;BUFFER[0]:=12;END;
UNTIL BUFFER[0]=12};END;IF BUFFER[LIMIT]=13 THEN BUFFER[LIMIT]:=32;
END ELSE IF BUFFER[0]<>12 THEN BEGIN LIMIT:=0;BUFFER[0]:=12;
END ELSE INPUTHASENDE:=TRUE;LINE:=LINE+1;LOC:=0;END;
{116}FUNCTION CONTROLCODE(C:ASCIICODE):EIGHTBITS;
BEGIN CASE C OF 64:CONTROLCODE:=64;39:CONTROLCODE:=12;
32,9:CONTROLCODE:=137;42:BEGIN WRITE(TTY,'*');CONTROLCODE:=137;END;
68,100:CONTROLCODE:=133;70,102:CONTROLCODE:=132;123:CONTROLCODE:=9;
125:CONTROLCODE:=10;80,112:CONTROLCODE:=134;
84,116,94,46,58:CONTROLCODE:=131;38:CONTROLCODE:=127;
60:CONTROLCODE:=135;OTHERS:CONTROLCODE:=0 END;END;
{117}FUNCTION SKIPAHEAD:EIGHTBITS;LABEL 30;VAR C:EIGHTBITS;
BEGIN WHILE TRUE DO BEGIN IF LOC>LIMIT THEN BEGIN GETLINE;
IF BUFFER[0]=12 THEN BEGIN LOC:=1;C:=136;GOTO 30;END;END;
BUFFER[LIMIT+1]:=64;WHILE BUFFER[LOC]<>64 DO LOC:=LOC+1;
IF LOC<=LIMIT THEN BEGIN LOC:=LOC+2;C:=CONTROLCODE(BUFFER[LOC-1]);
IF(C<>0)OR(BUFFER[LOC-1]=62)THEN GOTO 30;END;END;30:SKIPAHEAD:=C;END;
{118}PROCEDURE SKIPCOMMENT;LABEL 10;VAR BAL:EIGHTBITS;C:ASCIICODE;
BEGIN BAL:=0;WHILE TRUE DO BEGIN IF LOC>LIMIT THEN BEGIN GETLINE;
IF BUFFER[0]=12 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Page ended in mid-comment');ERROR;END;LOC:=1;GOTO 10;END;
END;C:=BUFFER[LOC];LOC:=LOC+1;{119}IF C=64 THEN BEGIN C:=BUFFER[LOC];
IF(C<>32)AND(C<>9)AND(C<>42)THEN LOC:=LOC+1 ELSE BEGIN BEGIN WRITELN(TTY
);WRITE(TTY,'! Module ended in mid-comment');ERROR;END;LOC:=LOC-1;
GOTO 10;
END END ELSE IF(C=92)AND(BUFFER[LOC]<>64)THEN LOC:=LOC+1 ELSE IF C=123
THEN BAL:=BAL+1 ELSE IF C=125 THEN BEGIN IF BAL=0 THEN GOTO 10;
BAL:=BAL-1;END;END;10:END;{121}FUNCTION GETNEXT:EIGHTBITS;LABEL 20,30;
VAR C:EIGHTBITS;D:EIGHTBITS;J,K:0..LONGESTNAME;
BEGIN 20:IF LOC>LIMIT THEN GETLINE;C:=BUFFER[LOC];LOC:=LOC+1;
CASE C OF 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85
,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111
,112,113,114,115,116,117,118,119,120,121,122:{123}BEGIN IF((C=101)OR(C=
69))AND(LOC>1)THEN IF(BUFFER[LOC-2]<=57)AND(BUFFER[LOC-2]>=48)THEN C:=0;
IF C<>0 THEN BEGIN LOC:=LOC-1;IDFIRST:=LOC;REPEAT LOC:=LOC+1;
D:=BUFFER[LOC];
UNTIL((D<48)OR((D>57)AND(D<65))OR((D>90)AND(D<97))OR(D>122))AND(D<>95);
IF LOC>IDFIRST+1 THEN BEGIN C:=130;IDLOC:=LOC;END;END ELSE C:=69;END;
34:{124}BEGIN DOUBLECHARS:=0;IDFIRST:=LOC-1;REPEAT D:=BUFFER[LOC];
LOC:=LOC+1;IF(D=34)OR(D=64)THEN IF BUFFER[LOC]=D THEN BEGIN LOC:=LOC+1;
D:=0;DOUBLECHARS:=DOUBLECHARS+1;
END ELSE BEGIN IF D=64 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Double @ sign missing');ERROR;
END END ELSE IF LOC>LIMIT THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! String constant didn''t end');ERROR;END;D:=34;END;
UNTIL D=34;IDLOC:=LOC-1;C:=130;END;
64:{125}BEGIN C:=CONTROLCODE(BUFFER[LOC]);LOC:=LOC+1;
IF C=0 THEN GOTO 20 ELSE IF C=135 THEN{126}BEGIN{128}K:=0;
WHILE TRUE DO BEGIN IF LOC>LIMIT THEN BEGIN GETLINE;
IF BUFFER[0]=12 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Page ended in module name');ERROR;END;LOC:=1;GOTO 30;END;
END;D:=BUFFER[LOC];{129}IF D=64 THEN BEGIN D:=BUFFER[LOC+1];
IF D=62 THEN BEGIN LOC:=LOC+2;GOTO 30;END;
IF(D=32)OR(D=9)OR(D=42)THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Module name didn''t end');ERROR;END;GOTO 30;END;K:=K+1;
MODULE[K]:=64;LOC:=LOC+1;END;LOC:=LOC+1;IF K<LONGESTNAME-1 THEN K:=K+1;
IF(D=32)OR(D=9)THEN BEGIN D:=32;IF MODULE[K-1]=32 THEN K:=K-1;END;
MODULE[K]:=D;END;
30:{130}IF K>=LONGESTNAME-2 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Module name too long: ');END;
FOR J:=1 TO 25 DO WRITE(TTY,XCHR[MODULE[J]]);WRITE(TTY,'...');END;
IF(MODULE[K]=32)AND(K>0)THEN K:=K-1;;
IF K>3 THEN BEGIN IF(MODULE[K]=46)AND(MODULE[K-1]=46)AND(MODULE[K-2]=46)
THEN CURMODULE:=PREFIXLOOKUP(K-3)ELSE CURMODULE:=MODLOOKUP(K);
END ELSE CURMODULE:=MODLOOKUP(K);
END ELSE IF C=131 THEN BEGIN REPEAT C:=SKIPAHEAD;UNTIL C<>64;
IF BUFFER[LOC-1]<>62 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Improper @ within control text');ERROR;END;GOTO 20;END;END;
{122}46:IF BUFFER[LOC]=46 THEN BEGIN C:=32;LOC:=LOC+1;
END ELSE IF BUFFER[LOC]=41 THEN BEGIN C:=93;LOC:=LOC+1;END;
58:IF BUFFER[LOC]=61 THEN BEGIN C:=24;LOC:=LOC+1;END;
61:IF BUFFER[LOC]=61 THEN BEGIN C:=30;LOC:=LOC+1;END;
62:IF BUFFER[LOC]=61 THEN BEGIN C:=29;LOC:=LOC+1;END;
60:IF BUFFER[LOC]=61 THEN BEGIN C:=28;LOC:=LOC+1;
END ELSE IF BUFFER[LOC]=62 THEN BEGIN C:=26;LOC:=LOC+1;END;
40:IF BUFFER[LOC]=42 THEN BEGIN C:=9;LOC:=LOC+1;
END ELSE IF BUFFER[LOC]=46 THEN BEGIN C:=91;LOC:=LOC+1;END;
42:IF BUFFER[LOC]=41 THEN BEGIN C:=10;LOC:=LOC+1;END;32,9:GOTO 20;
123:BEGIN SKIPCOMMENT;GOTO 20;END;12:C:=136;OTHERS:END;
{IF TROUBLESHOOT THEN DEBUGHELP;}GETNEXT:=C;END;
{132}PROCEDURE SCANNUMERIC(P:NAMEPOINTER);LABEL 21,30;
VAR ACCUMULATOR:INTEGER;NEXTSIGN:-1..+1;Q:NAMEPOINTER;VAL:INTEGER;
PROCEDURE ADDIN(V:INTEGER);BEGIN ACCUMULATOR:=ACCUMULATOR+NEXTSIGN*V;
NEXTSIGN:=+1;END;BEGIN{133}ACCUMULATOR:=0;NEXTSIGN:=+1;
WHILE TRUE DO BEGIN NEXTCONTROL:=GETNEXT;
21:CASE NEXTCONTROL OF 48,49,50,51,52,53,54,55,56,57:BEGIN{135}VAL:=0;
REPEAT VAL:=10*VAL+NEXTCONTROL-48;NEXTCONTROL:=GETNEXT;
UNTIL(NEXTCONTROL>57)OR(NEXTCONTROL<48);;ADDIN(VAL);GOTO 21;END;
12:BEGIN{136}VAL:=0;NEXTCONTROL:=48;REPEAT VAL:=8*VAL+NEXTCONTROL-48;
NEXTCONTROL:=GETNEXT;UNTIL(NEXTCONTROL>55)OR(NEXTCONTROL<48);;
ADDIN(VAL);GOTO 21;END;130:BEGIN Q:=IDLOOKUP(0);
IF ILK[Q]<>1 THEN BEGIN NEXTCONTROL:=42;GOTO 21;END;
ADDIN(EQUIV[Q]-32768);END;43:;45:NEXTSIGN:=-NEXTSIGN;
132,133,135,134,136,137:GOTO 30;59:BEGIN WRITELN(TTY);
WRITE(TTY,'! Omit semicolon in numeric definition');ERROR;END;
OTHERS:{134}BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Improper numeric definition will be flushed');ERROR;END;
REPEAT NEXTCONTROL:=SKIPAHEAD UNTIL(NEXTCONTROL>=132);
IF NEXTCONTROL=135 THEN BEGIN LOC:=LOC-2;NEXTCONTROL:=GETNEXT;END;
ACCUMULATOR:=0;GOTO 30;END END;END;30:;
IF ABS(ACCUMULATOR)>=32768 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Value too big: ',ACCUMULATOR:0);ERROR;END;ACCUMULATOR:=0;
END;EQUIV[P]:=ACCUMULATOR+32768;END;
{139}PROCEDURE SCANREPL(T:EIGHTBITS);LABEL 22,30,31;VAR A:SIXTEENBITS;
B:ASCIICODE;BAL:EIGHTBITS;BEGIN BAL:=0;
WHILE TRUE DO BEGIN 22:A:=GETNEXT;CASE A OF 40:BAL:=BAL+1;
41:IF BAL=0 THEN BEGIN WRITELN(TTY);WRITE(TTY,'! Extra )');ERROR;
END ELSE BAL:=BAL-1;39:{142}BEGIN B:=39;
WHILE TRUE DO BEGIN BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=B;TOKPTR:=TOKPTR+1;END;
IF B=64 THEN IF BUFFER[LOC]=64 THEN LOC:=LOC+1 ELSE BEGIN WRITELN(TTY);
WRITE(TTY,'! You should double @ signs in strings');ERROR;END;
IF LOC=LIMIT THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! String didn''t end');ERROR;END;BUFFER[LOC]:=39;
BUFFER[LOC+1]:=0;END;B:=BUFFER[LOC];LOC:=LOC+1;
IF B=39 THEN BEGIN IF BUFFER[LOC]<>39 THEN GOTO 31 ELSE BEGIN LOC:=LOC+1
;BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=39;TOKPTR:=TOKPTR+1;END;END;END;END;31:END;
35:IF T=3 THEN A:=13;{141}130:BEGIN A:=IDLOOKUP(0);
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=(A DIV 256)+128;TOKPTR:=TOKPTR+1;END;A:=A MOD 256;END;
135:IF T<>135 THEN GOTO 30 ELSE BEGIN BEGIN IF TOKPTR=MAXTOKS THEN BEGIN
WRITELN(TTY);WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;
QUIT;END;TOKMEM[TOKPTR]:=(CURMODULE DIV 256)+168;TOKPTR:=TOKPTR+1;END;
A:=CURMODULE MOD 256;END;
133,132,134:IF T<>135 THEN GOTO 30 ELSE BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! @',XCHR[BUFFER[LOC-1]],' is ignored in PASCAL text');ERROR;
END;GOTO 22;END;136,137:GOTO 30;OTHERS:END;
BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=A;TOKPTR:=TOKPTR+1;END;END;30:NEXTCONTROL:=A;
{140}IF BAL>0 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Missing ',BAL:0,' )');ERROR;END;
WHILE BAL>0 DO BEGIN BEGIN IF TOKPTR=MAXTOKS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','token',' capacity exceeded');ERROR;QUIT;END;
TOKMEM[TOKPTR]:=41;TOKPTR:=TOKPTR+1;END;BAL:=BAL-1;END;END;
IF TEXTPTR=MAXTEXTS THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Sorry, ','text',' capacity exceeded');ERROR;QUIT;END;
CURREPLTEXT:=TEXTPTR;TEXTPTR:=TEXTPTR+1;TOKSTART[TEXTPTR]:=TOKPTR;END;
{143}PROCEDURE DEFINEMACRO(T:EIGHTBITS);VAR P:NAMEPOINTER;
BEGIN P:=IDLOOKUP(T);SCANREPL(T);EQUIV[P]:=CURREPLTEXT;
TEXTLINK[CURREPLTEXT]:=0;END;{145}PROCEDURE SCANMODULE;LABEL 30,10;
VAR P:NAMEPOINTER;BEGIN MODULECOUNT:=MODULECOUNT+1;{146}NEXTCONTROL:=0;
WHILE TRUE DO BEGIN 22:WHILE NEXTCONTROL<=132 DO BEGIN NEXTCONTROL:=
SKIPAHEAD;IF NEXTCONTROL=135 THEN BEGIN LOC:=LOC-2;NEXTCONTROL:=GETNEXT;
END;END;IF NEXTCONTROL<>133 THEN GOTO 30;NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL<>130 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Definition flushed, must start with ',
'identifier of length > 1');ERROR;END;GOTO 22;END;NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=61 THEN BEGIN SCANNUMERIC(IDLOOKUP(1));GOTO 22;
END ELSE IF NEXTCONTROL=30 THEN BEGIN DEFINEMACRO(2);GOTO 22;
END ELSE{147}IF NEXTCONTROL=40 THEN BEGIN NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=35 THEN BEGIN NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=41 THEN BEGIN NEXTCONTROL:=GETNEXT;
IF NEXTCONTROL=61 THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! Use == for macros');ERROR;END;NEXTCONTROL:=30;END;
IF NEXTCONTROL=30 THEN BEGIN DEFINEMACRO(3);GOTO 22;END;END;END;END;;
BEGIN WRITELN(TTY);
WRITE(TTY,'! Definition flushed since it starts badly');ERROR;END;END;
30:;{148}CASE NEXTCONTROL OF 134:P:=0;135:BEGIN P:=CURMODULE;
{149}REPEAT NEXTCONTROL:=GETNEXT;UNTIL NEXTCONTROL<>43;
IF(NEXTCONTROL<>61)AND(NEXTCONTROL<>30)THEN BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'! PASCAL text flushed, = sign is missing');ERROR;END;
REPEAT NEXTCONTROL:=SKIPAHEAD;UNTIL NEXTCONTROL>=136;GOTO 10;END;END;
OTHERS:GOTO 10 END;{150}STORETWOBYTE(53248+MODULECOUNT);;SCANREPL(135);
{151}IF P=0 THEN BEGIN TEXTLINK[LASTUNNAMED]:=CURREPLTEXT;
LASTUNNAMED:=CURREPLTEXT;
END ELSE IF EQUIV[P]=0 THEN EQUIV[P]:=CURREPLTEXT ELSE BEGIN P:=EQUIV[P]
;WHILE TEXTLINK[P]<MAXTEXTS DO P:=TEXTLINK[P];TEXTLINK[P]:=CURREPLTEXT;
END;TEXTLINK[CURREPLTEXT]:=MAXTEXTS;;;10:END;{154}{PROCEDURE DEBUGHELP;
LABEL 888,10;VAR K:SIXTEENBITS;BEGIN DEBUGSKIPPED:=DEBUGSKIPPED+1;
IF DEBUGSKIPPED<DEBUGCYCLE THEN GOTO 10;DEBUGSKIPPED:=0;
888:['*************breakpoint*************';
'***********for**debugging***********']WHILE TRUE DO BEGIN WRITE(TTY,'#'
);READ(TTY,DDT);IF DDT<0 THEN GOTO 10 ELSE IF DDT=0 THEN GOTO 888;
READ(TTY,DD);CASE DDT OF 1:PRINTID(DD);2:PRINTREPL(DD);
3:FOR K:=1 TO DD DO WRITE(TTY,XCHR[BUFFER[K]]);
4:FOR K:=1 TO DD DO WRITE(TTY,XCHR[MODULE[K]]);
5:FOR K:=1 TO OUTPTR DO WRITE(TTY,XCHR[OUTBUF[K]]);
6:FOR K:=1 TO DD DO WRITE(TTY,XCHR[OUTCONTRIB[K]]);
OTHERS:WRITE(TTY,'?')END;END;10:END;}{155}BEGIN INITIALIZE;
{113}OPENINPUT;PAGE:=0;LINE:=0;LIMIT:=0;LOC:=1;BUFFER[0]:=32;
INPUTHASENDE:=FALSE;;{156}PHASEONE:=TRUE;MODULECOUNT:=0;
REPEAT NEXTCONTROL:=SKIPAHEAD;WHILE NEXTCONTROL=137 DO SCANMODULE;
UNTIL INPUTHASENDE;PHASEONE:=FALSE;;{MAXTOKPTR:=TOKPTR;
}{102}IF TEXTLINK[0]=0 THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! No output was specified.');
END ELSE BEGIN BEGIN WRITELN(TTY);
WRITE(TTY,'Writing the output file...');END;{73}STACKPTR:=1;
BRACELEVEL:=0;CURSTATE.NAMEFIELD:=0;CURSTATE.REPLFIELD:=TEXTLINK[0];
CURSTATE.BYTEFIELD:=TOKSTART[CURSTATE.REPLFIELD];
CURSTATE.ENDFIELD:=TOKSTART[CURSTATE.REPLFIELD+1];;{86}OUTSTATE:=0;
OUTPTR:=0;BREAKPTR:=0;SEMIPTR:=0;OUTBUF[0]:=0;LINE:=1;;SENDTHEOUTPU;
{88}IF(OUTSTATE<>0)OR(OUTBUF[BREAKPTR]<>46)THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! Program didn''t end with period');ERROR;END;
BREAKPTR:=OUTPTR;SEMIPTR:=0;FLUSHBUFFER;;BEGIN WRITELN(TTY);
WRITE(TTY,'Done.');END;END;
9999:IF STRINGPTR>128 THEN BEGIN WRITELN(TTY);
WRITE(TTY,STRINGPTR-128:0,' strings written to string pool file.');END;
{[157]BEGIN WRITELN(TTY);WRITE(TTY,'Memory usage statistics:');END;
BEGIN WRITELN(TTY);
WRITE(TTY,NAMEPTR:0,' names, ',TEXTPTR:0,' replacement texts;');END;
BEGIN WRITELN(TTY);
WRITE(TTY,BYTEPTR:0,' bytes, ',MAXTOKPTR:0,' tokens.');END;;}END.